package com.hsylient.kafka.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class TaskFailure {

    /**
     * 这个方法在本类中调用两个异步方法，其实这个地方是：this.asyncTask1(); 因为this可以省略所以没有显示的写出来
     * 这里使用this调用了方法，然后async因该低层是跟事务一样的使用的代理模式，this调用的话，不能被代理到，走不到代理方法，所以失效了。不用this就好了
     *
     * @throws InterruptedException 中断异常
     */
    public void asyncTaskTotal() throws InterruptedException {
//        TaskFailure taskFailure = SpringUtil.getBean(TaskFailure.class);
        asyncTask1();
        asyncTask2();
    }

    /**
     * 模拟5秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask1() throws InterruptedException {
        doTask("asyncTask1", 5);
        return CompletableFuture.completedFuture(Boolean.TRUE);
    }

    @Async
    public Future<Boolean> asyncTask2() throws InterruptedException {
        doTask("asyncTask2", 2);
        return CompletableFuture.completedFuture(Boolean.TRUE);
    }


    private void doTask(String taskName, Integer time) throws InterruptedException {
        log.info("{}开始执行，当前线程的名称[{}]", taskName, Thread.currentThread().getName());
        TimeUnit.SECONDS.sleep(time);
        log.info("{}执行成功，当前线程的名称[{}]", taskName, Thread.currentThread().getName());
    }
}
